package day05;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

/**
 * <>
 * <详细描述>
 * <底层是基于动态数组，根据下表随机访问数组元素的效率高，向数组尾部添加元素的效率高；
 *     但是，删除数组中的数据以及向数组中间添加数据效率低，因为需要移动数组。></>
 * <Linkedlist基于链表的动态数组，数据添加删除效率高，
 * 只需要改变指针指向即可，但是访问数据的平均效率低，需要对链表进行遍历。></>
 * @Author WANG.SONG.
 * @Date 2019/2/27 0027 22:24
 * @see java.util.LinkedList
 */
public class LinkedAndArray {
    private static final int COUNT = 1000000;

    private static final int NUM = 100000;

    private static List<Integer> arrays;
    private static List<Integer> linked;

    static {
        arrays = new ArrayList<>();
        for (int i = 0 ; i <= COUNT; i++){
            arrays.add(i);
        }
        linked = new LinkedList<>();
        for (int i = 0 ; i <= COUNT; i++){
            linked.add(0,i);
        }

    }

    /**
     *<头部插入>
     *@param
     *
     *@return
     *@Author WANG.SONG.
     */
    public static void headAdd(){
        List<Integer> arrays = new ArrayList<>();
        long l = System.currentTimeMillis();
        for (int i = 0 ; i <= NUM; i++){
            arrays.add(0,i);
        }
        System.out.println("arrayList头部插入："+(System.currentTimeMillis() -l));

        List<Integer> linked = new LinkedList<>();
        long l1 = System.currentTimeMillis();
        for (int i = 0 ; i <= NUM; i++){
            linked.add(0,i);
        }
        System.out.println("linkedList头部插入："+(System.currentTimeMillis() -l1));
    }

    /**
     *<随机下标查询比较>
     *@param
     *
     *@return
     *@Author WANG.SONG.
     */
    public static void select(int num){
        long l1 = System.currentTimeMillis();
        for (int i = 0; i<= num; i++){
            linked.get(num);
        }

        System.out.println("linkedList查询："+(System.currentTimeMillis() -l1));

        long l = System.currentTimeMillis();
        for (int i = 0; i<= num; i++){
            arrays.get(num);
        }
        System.out.println("arrayList查询："+(System.currentTimeMillis() -l));
    }


    public static void synList(){
        /**同步*/
        List<Object> stringList = Collections.synchronizedList(new ArrayList<>());

    }
    public static void main(String[] args) {
        /**尾部添加效率比较，array优势**/

        /**中间或者头部添加效率比较，lined优势**/
        LinkedAndArray.headAdd();
        /**获取元素效率比较，array优势**/
        LinkedAndArray.select(50000);
    }
}
